// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com

// ReSharper disable CheckNamespace
// ReSharper disable CommentTypo
// ReSharper disable IdentifierTypo
// ReSharper disable InconsistentNaming
// ReSharper disable StringLiteralTypo
// ReSharper disable UnusedMember.Global
// ReSharper disable UseNameofExpression

/*
 * Ars Magna project, http://arsmagna.ru
 */

#nullable enable

namespace HtmlAgilityPack;

/// <summary>
/// Represents a base class for fragments in a mixed code document.
/// </summary>
public abstract class MixedCodeDocumentFragment
{
    #region Fields

    internal MixedCodeDocument Doc;
    private string _fragmentText;
    internal int Index;
    internal int Length;
    private int _line;
    internal int _lineposition;
    internal MixedCodeDocumentFragmentType _type;

    #endregion

    #region Constructors

    internal MixedCodeDocumentFragment(MixedCodeDocument doc, MixedCodeDocumentFragmentType type)
    {
        Doc = doc;
        _type = type;
        switch (type)
        {
            case MixedCodeDocumentFragmentType.Text:
                Doc.TextFragments.Append(this);
                break;

            case MixedCodeDocumentFragmentType.Code:
                Doc.CodeFragments.Append(this);
                break;
        }

        Doc.Fragments.Append(this);
    }

    #endregion

    #region Properties

    /// <summary>
    /// Gets the fragement text.
    /// </summary>
    public string FragmentText
    {
        get
        {
            if (_fragmentText == null)
            {
                _fragmentText = Doc._text.Substring(Index, Length);
            }

            return _fragmentText;
        }
        internal set { _fragmentText = value; }
    }

    /// <summary>
    /// Gets the type of fragment.
    /// </summary>
    public MixedCodeDocumentFragmentType FragmentType
    {
        get { return _type; }
    }

    /// <summary>
    /// Gets the line number of the fragment.
    /// </summary>
    public int Line
    {
        get { return _line; }
        internal set { _line = value; }
    }

    /// <summary>
    /// Gets the line position (column) of the fragment.
    /// </summary>
    public int LinePosition
    {
        get { return _lineposition; }
    }

    /// <summary>
    /// Gets the fragment position in the document's stream.
    /// </summary>
    public int StreamPosition
    {
        get { return Index; }
    }

    #endregion
}
